package com.first.computerstore.service;

import com.first.computerstore.dao.CartMapper;
import com.first.computerstore.dao.ProductMapper;
import com.first.computerstore.dao.UserMapper;
import com.first.computerstore.entity.Cart;
import com.first.computerstore.entity.Product;
import com.first.computerstore.entity.User;
import com.first.computerstore.utils.AssertUtil;
import com.first.computerstore.utils.JsonResult;
import com.first.computerstore.vo.CartVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * Description:购物车模块
 * Author: LI
 * Date: 2023/6/30 9:29
 * Version: ${1:1.0.0}
 */


@Service
public class CartService {

    @Resource
    private CartMapper cartMapper;
    @Resource
    private UserMapper userMapper;
    @Resource
    private ProductMapper productMapper;

    /**
     * 查询购物车订单
     * @param cid
     * @return
     */
    public Cart queryCartByCid(Integer cid) {
        AssertUtil.isTrue(null==cid,"购物车订单id不能为空！");

        Cart cart = cartMapper.queryCartByCid(cid);

        return  cart;

    }

    /**购物车数据显示
     *
     * 查询购物车数据
     *     （登录状态，传入用户uid）
     *     1、判断用户uid是否为空
     *         为空，提示用户，并return
     *         不为空，通过用户uid查询对应的购物车商品，存入List集合中
     *              判断list的长度
     *
     * @param uid
     * @return
     */
    public JsonResult<List<CartVo>> queryCartProductByUid(Integer uid){
        JsonResult<List<CartVo>> jsonResult = new JsonResult<>();

        //判断用户Id是否为空
        if (null == uid){
            jsonResult.setStatus(4000);
            jsonResult.setMessage("用户不存在！");
            return jsonResult;
        }

        //通过用户uid查询对应的购物车商品，存入List集合中
        List<CartVo> cartVoList = cartMapper.queryCartProductByUid(uid);

        jsonResult.setStatus(200);
        jsonResult.setData(cartVoList);

        return jsonResult;
    }


    /**
     * 删除购物车数据
     *      判断是否是登陆状态，判断uid是否为空
     *
     *          为空不允许进行删除操作
     *              设置提示信息，return
     *          不为空，进行删除操作，返回受影响的行数
     *              判断删除是否多选
     *
     *
     * @param uid
     * @return
     */
    public void deleteProductFromCart(Integer uid,String cids) {
        JsonResult<Integer> jsonResult = new JsonResult<>();

        //判断用户Id是否为空
        if (null == uid) {
            jsonResult.setStatus(4000);
            jsonResult.setMessage("请先登录账号！");
        }

        //通过逗号分隔进行拆分，存储到集合中
        String[] cidString = cids.split(",");

        //判断购物车id是否为空
        if (cidString.length <= 0) {
            jsonResult.setStatus(4000);
            jsonResult.setMessage("购物车空！");
        }
        //判断是否多选
        if (cidString.length == 1) {
            //进行删除操作
            AssertUtil.isTrue(cartMapper.deleteProductFromCart(cidString[0])<1,"删除失败");

        } else {
            for (String cid : cidString) {
                //进行删除操作
                AssertUtil.isTrue(cartMapper.deleteProductFromCart(cid)<1,"删除失败");

            }
        }
    }

    /**
     * 修改商品数量
     *
     *      判断用户uid是否为空
     *          为空，设置提示信息，return
     *          不为空，通过uid得到用户对象
     *              得到uname，用于在数据库设置修改人name
     *      进行修改操作，返回受影响的行数
     *      判断受影响的行数
     *          长度大于0，修改成功
     *      判断num是否修改为0
     *          为0，调用删除方法，从购物车中删除
     *
     * @param cid
     * @param num
     * @return
     */
    public JsonResult<Integer> updateCartNum(Integer cid, Integer num,Integer uid){
        JsonResult<Integer> jsonResult = new JsonResult<>();

        //判断用户uid是否为空
        if (null == uid){
            jsonResult.setStatus(4000);
            jsonResult.setMessage("请先登录账号！");
        }
        //查询user对象，获取用户名
        User user = userMapper.queryUserByUid(uid);
        String uname = user.getUsername();

        //进行修改操作，返回受影响的行数
        AssertUtil.isTrue(cartMapper.updateCartNum(cid,num,uname) < 0,"修改失败！");

        //判断商品数量，商品数量为0，直接删除
        if (num == 0){
            cartMapper.deleteProductFromCart(String.valueOf(cid));
        }

        return jsonResult;
    }

    /**
     *  添加商品进购物车
     *
     *  判断商品状态
     *      根据pid查询t_product.status
     *      状态码为2、3，不允许添加商品
     *  判断商品的价格是否与t_product中商品的价格一致
     *  判断选购的商品num值小于t_product中商品的num值
     *         满足条件
     *         执行添加操作，判断受影响的行数
     *
     * @param pid
     * @param price
     * @param num
     * @return
     */
    public JsonResult<Integer> addUserCart(Integer uid,Integer pid, Long price, Integer num) {
        JsonResult<Integer> jsonResult = new JsonResult<>();

        //判断商品状态码
        AssertUtil.isTrue(cartMapper.queryProductStatusByPid(pid) !=1,"商品不存在！");

        //商品详情
        Product product = productMapper.queryProductByPid(pid);
        //商品的价格与t_product中商品的价格一致
        if (!product.getPrice().equals(price)) {
            jsonResult.setStatus(4000);
            jsonResult.setMessage("该商品出现异常！不允许加入购物车！");
        }
        //选购的num值小于t_product中商品的num
        if (num > product.getNum()) {
            jsonResult.setStatus(4000);
            jsonResult.setMessage("该商品库存不足！请调整商品数量！");
        }


        /**     加入购物车时，判断购物车中是否已经存在该商品
         *          存在，使商品数量加1
         *          不存在，将数据添加进购物车
         * 判断要加入购物车的商品id与购物车中的商品id是否相等
         *      相等：调用修改方法将num加1
         *      不相等，执行添加操作
         */

        //通过User对象得到uname
        User user = userMapper.queryUserByUid(uid);
        String uname = user.getUsername();

        //通过uid查询购物车商品对象，返回一个集合
        List<CartVo> cartInfos = cartMapper.queryCartProductByUid(uid);

        boolean found = false; // 用于标记是否找到匹配的商品

        for (CartVo cartInfo : cartInfos) {
            if (cartInfo.getPid().equals(pid)) {
                // 更新 num
                cartMapper.updateCartNum(cartInfo.getCid(), cartInfo.getNum() + 1, uname);
                found = true; // 找到匹配的商品
                break; // 结束循环，不再继续查找
            }
        }

        // 如果没有找到匹配的商品，则执行添加操作
        if (!found) {
            int rows = cartMapper.addUserCart(uid, pid, price, num, uname);
            AssertUtil.isTrue(rows < 0, "添加失败！");
        }

        return jsonResult;
    }

    /**
     * 根据cid查询商品信息和购物车信息
     * @param cid
     * @return
     */
    public CartVo queryCartVoByCid(Integer cid) {
        AssertUtil.isTrue(null==cid,"购物车id不能为空！");

        CartVo cartVo = cartMapper.queryCartVoByCid(cid);
        return  cartVo;
    }
}
